/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estructurassa.expertos;

import java.util.HashMap;

/**
 *
 * @author diego
 */
public class FabricaExpertos {

    private static FabricaExpertos instancia;
    private HashMap<expertos, Experto> expertos = new HashMap<>();

    public static FabricaExpertos getInstancia() {
        if (instancia == null) {
            instancia = new FabricaExpertos();
        }
        return instancia;
    }

    private FabricaExpertos() {
    }

    public enum expertos {

        GENERAR_CODIGO, ABM_MATERIAL, CONSULTAR_MAT_PRIMA, ABM_TIPO_MATERIAL,
        ABM_TRABAJADOR, ABM_CATEGORIA_TRABAJADOR, ABM_MAQUINARIA, ABM_CENTRO_DE_TRABAJO, ABM_PROVEEDOR,
        ABM_RUTA_DE_FABRICACION, ABM_PRODUCTO_TERMINADO, ABM_ORDEN_DE_PRODUCCION, ABM_CLASIFICACION_PRODUCTO,
        ABM_PRODUCTO_INTERMEDIO, ABM_COSTOS_FIJOS, STOCK, ABM_PRODUCTO_ESTANDAR, ABM_PEDIDO_PROVEEDOR, PREDICCION_DEMANDA
    }

    public Experto getExperto(expertos expertoNombre) {
        Experto experto = expertos.get(expertoNombre);
        if (experto != null) {
            return experto;
        }
        switch (expertoNombre) {
            case GENERAR_CODIGO:
                experto = new ExpertoCodigo();
                break;
            case ABM_TIPO_MATERIAL:
                experto = new ExpertoABMTipoMaterial();
                break;
            case ABM_MATERIAL:
                experto = new ExpertoABMMaterial();
                break;
            case ABM_CATEGORIA_TRABAJADOR:
                experto = new ExpertoABMCategoriaTrabajador();
                break;
            case ABM_TRABAJADOR:
                experto = new ExpertoABMTrabajador();
                break;
            case ABM_MAQUINARIA:
                experto = new ExpertoABMMaquinaria();
                break;
            case ABM_CENTRO_DE_TRABAJO:
                experto = new ExpertoABMCentroDeTrabajo();
                break;
            case ABM_PROVEEDOR:
                experto = new ExpertoABMProveedor();
                break;
            case ABM_RUTA_DE_FABRICACION:
                experto = new ExpertoABMRutaFabriacion();
                break;
            case ABM_PRODUCTO_TERMINADO:
                experto = new ExpertoABMProductoTerminado();
                break;
            case ABM_ORDEN_DE_PRODUCCION:
                experto = new ExpertoABMOrdenDeProduccion();
                break;
            case ABM_CLASIFICACION_PRODUCTO:
                experto = new ExpertoABMClasificacionProducto();
                break;
            case ABM_PRODUCTO_INTERMEDIO:
                experto = new ExpertoABMProductoIntermedio();
                break;
            case ABM_PRODUCTO_ESTANDAR:
                experto = new ExpertoCostosYProductoStandar();
                break;
            case ABM_COSTOS_FIJOS:
                experto = new ExpertoABMCostosFijos();
                break;
            case ABM_PEDIDO_PROVEEDOR:
                experto = new ExpertoABMPedidoAProveedores();
                break;
            case STOCK:
                experto = new ExpertoStock();
                break;
            case PREDICCION_DEMANDA:
                experto = new ExpertoDemanda();
                break;
        }
        expertos.put(expertoNombre, experto);
        return experto;
    }
}
